home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / HYPERXCM / XCMDDIAL.C < prev    next >
Text File  |  1991-10-22  |  6KB  |  203 lines

  1. /*
  2.   ⌐ 1988 by Gary Bond
  3.   All Rights Reserved
  4.   Translation to C by Sioux Lacy
  5.   Modified by Dick Guertin
  6.   
  7.   Dialog:  A HyperCard XCMD that displays a modal dialog box.
  8.            The caller can privide the text, font, and location.
  9.            Dialog uses dialog box 135 from HyperCard's resource
  10.            fork, automatically centering the dialog window within
  11.            the card window.  Up to 255 characters can be displayed.
  12.  
  13.   Form:    Dialog "String to display", Top, Left, "Font Name"
  14.            Dialog "String to display", Top, Left
  15.            Dialog "String to display", "Font Name"
  16.            Dialog "String to display"
  17.   
  18.   Example: Dialog "Display this text", 100, 80, Geneva
  19.   
  20.   Note:    Top and Left are integers that specify the upper left point
  21.            at which to display the dialog.  If you don't supply values
  22.            for these, the dialog automatically centers itself within the
  23.            card window.  The font to display the text in is passed by
  24.            name; its size cannot be changed.
  25. */
  26.  
  27. #include <MacTypes.h>
  28. #include "HyperXCmd.h"
  29. #include "XCmdUtil.h"
  30.  
  31. /*- Additional includes for this XCMD -*/
  32.  
  33. #include <DialogMgr.h>
  34. #include <EventMgr.h>
  35. #include <QuickDraw.h>
  36.  
  37. /*- Prototypes -*/
  38.  
  39. pascal void main (XCmdBlockPtr);
  40. int         GetLocOfCardWindow (XCmdBlockPtr, Point*);
  41.  
  42. /*- Constants -*/
  43.  
  44. #define minParamCount  (short)  1
  45. #define maxParamCount  (short)  4
  46. #define errorFlag      (short) -1
  47. #define edgeCurve      (int)   16
  48. #define gapBetween     (int)   -4
  49. #define lineSize       (int)    3
  50. #define boxLeft        (int)   68
  51. #define boxTop         (int)  113
  52. #define dialogID       (int)  135
  53.  
  54. /*- main code to display text in dialog box -*/
  55.  
  56. pascal void main (paramPtr)
  57.   XCmdBlockPtr paramPtr;
  58. {
  59.   short     numParams;
  60.   Str255    displayStr;
  61.   Str255    fontName;
  62.   int       itemHit;
  63.   int       offsetLeft;
  64.   int       offsetTop;
  65.   int       myFontNum;
  66.   int       itemType;
  67.   DialogPtr myDialogPtr;
  68.   Handle    tempHandle;
  69.   Point     cardWindowLoc;
  70.   Rect      ctlRect;
  71.   GrafPtr   savePort;
  72.   PenState  savePen;
  73.  
  74. /*- Check for valid calling parameters -*/
  75.  
  76.   numParams = GetParamCount(paramPtr,minParamCount, maxParamCount);
  77.   if (numParams < 0)
  78.   {  Fail(paramPtr, "Form: Dialog \"string\", top, left, font");
  79.      return;
  80.   }
  81.  
  82.   if ((GetLocOfCardWindow(paramPtr, &cardWindowLoc)) < 0)
  83.   {  Fail(paramPtr, "Can't get rect of card window");
  84.      return;
  85.   }
  86.  
  87.   GetPort (&savePort);
  88.   GetPenState (&savePen);
  89.  
  90. /*- Set defaults for non-passed parms -*/
  91.  
  92.   myFontNum  = (int) 0;
  93.   offsetLeft = (int) boxLeft;
  94.   offsetTop  = (int) boxTop;
  95.   
  96. /*- Get the display parm, we know it exists -*/
  97.  
  98.   HandleToPstr (displayStr, paramPtr->params[0]);
  99.   
  100.   switch (numParams)
  101.   {  /*- Make assumptions based on paramCount -*/
  102.      case 2:  /*- string, font -*/
  103.      case 4:  /*- string, top, left, font -*/
  104.         HandleToPstr (fontName, paramPtr->params[numParams-1]);
  105.         GetFNum (fontName, &myFontNum);
  106.         if (numParams == 2) break;
  107.      case 3:  /*- string, top, left -*/
  108.         offsetTop  = (int) HandleToNum (paramPtr, paramPtr->params[1]);
  109.         offsetLeft = (int) HandleToNum (paramPtr, paramPtr->params[2]);
  110.      default: break;
  111.   }
  112.  
  113. /*- Set the cursor to the standard arrow -*/
  114.  
  115.   InitCursor();
  116.   
  117. /*- Make the dialog manager establish the "string" as ^0 -*/
  118.  
  119.   ParamText (displayStr, "", "", "");
  120.  
  121. /*- Establish the font for the dialog -*/
  122.  
  123.   SetDAFont (myFontNum);
  124.  
  125. /*------------------------------------------------------------------
  126. * Look in the resource fork for dialogID and return handle if found.
  127. * Make it the uppermost window, which is still invisible right now.
  128. *-----------------------------------------------------------------*/
  129.  
  130.   myDialogPtr = GetNewDialog (dialogID, (Ptr) 0, (WindowPtr) -1);
  131.  
  132. /*----------------------------------------------------------------
  133. * Move the dialog to its correct screen position before showing it.
  134. * If the user hasn't supplied a location, center the dialog within
  135. * the card window.  Then make the dialog the visible active window.
  136. *---------------------------------------------------------------*/
  137.  
  138.   MoveWindow (myDialogPtr, offsetLeft + cardWindowLoc.h,
  139.               offsetTop + cardWindowLoc.v, TRUE);
  140.   ShowWindow (myDialogPtr);
  141.  
  142. /*----------------------------------------------------------------
  143. * Make the dialog the current port and make the OK button the
  144. * default by drawing a 3-pixel line around it.  Use the constant
  145. * "OK" for the item number when getting the rect.
  146. *---------------------------------------------------------------*/
  147.  
  148.   SetPort (myDialogPtr);
  149.   PenSize (lineSize, lineSize);
  150.   GetDItem (myDialogPtr, OK, &itemType, &tempHandle, &ctlRect);
  151.   InsetRect (&ctlRect, gapBetween, gapBetween);
  152.   FrameRoundRect (&ctlRect, edgeCurve, edgeCurve);
  153.  
  154. /*----------------------------------------------------------------
  155. * Before we make the dialog active, flush events so pending key
  156. * and mouse events won't put the dialog away too early.  Once active,
  157. * Once active, test for a click of the "OK" button.
  158. *---------------------------------------------------------------*/
  159.  
  160.   FlushEvents ((int) everyEvent, (int) 0);
  161.   
  162.   do  /*- wait for "OK" -*/
  163.   {  ModalDialog ((Ptr) 0, &itemHit);
  164.   }  while (itemHit != OK);
  165.  
  166. /*----------------------------------------------------------------
  167. * We are done.  The user has clicked the OK button, so now it's
  168. * time to clean up, restore the port and penstate.
  169. *---------------------------------------------------------------*/
  170.  
  171.   DisposDialog (myDialogPtr);
  172.   SetDAFont (0);  /*- reset to system font -*/
  173.   SetPort (savePort);
  174.   SetPenState (&savePen);
  175.   
  176.   return;  /*- Back to HyperCard -*/
  177.  
  178. } /*- proc-end: main -*/
  179.  
  180. int GetLocOfCardWindow (paramPtr, loc)
  181.   XCmdBlockPtr paramPtr;
  182.   Point *loc;
  183. { /*- return error code indicating success/failure -*/
  184.   Handle hndl;
  185.   char   *str;
  186.   
  187.   str = "\pitem 1 of rect of card window";
  188.   hndl = EvalExpr(paramPtr, (StringPtr) str);
  189.   if (paramPtr->result == noErr)
  190.   {  loc->h = HandleToNum(paramPtr, hndl);
  191.      DisposHandle(hndl);
  192.      
  193.      str = "\pitem 2 of rect of card window";
  194.      hndl = EvalExpr(paramPtr, (StringPtr) str);
  195.      if (paramPtr->result == noErr)
  196.      {  loc->v = HandleToNum(paramPtr, hndl);
  197.         DisposHandle(hndl);
  198.         return(noErr);
  199.      }
  200.   }
  201.   return ((int) errorFlag);
  202. } /*- proc-end: GetLocOfCardWindow -*/
  203.